/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.edu.upc.dew.helpdesk.dao;


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dew.helpdesk.model.Ticket;
import pe.edu.upc.dew.helpdesk.util.JdbcUtils;

/**
 *
 * @author Miguel
 */
public class TicketDaoJdbc implements TicketDao {

    public Ticket getTicketPorNumero(Integer numero) {
        Ticket ticket = null;
        Connection connection = null;
        
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            connection = JdbcUtils.getConnection();
            String query = "select * from ticket where numero = ?;";
            
            pstmt = connection.prepareStatement(query);
            pstmt.setInt(1,numero);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                ticket = new Ticket();
                ticket.setNumero(rs.getInt("numero"));
                ticket.setFechaCreacion(rs.getDate("fechaCreacion"));
                ticket.setFechaModificacion(rs.getDate("fechaModificacion"));
                ticket.setFechaCierre(rs.getDate("fechaCierre"));
                ticket.setPrioridad(rs.getInt("prioridad"));
                ticket.setDescripcion(rs.getString("descripcion"));
                ticket.setDetalle(rs.getString("detalle"));
                ticket.setTipo(rs.getString("tipo"));
                ticket.setArchivo(rs.getString("archivo"));
                ticket.setEstado(rs.getString("estado"));
            }
        } catch (SQLException e) {
            throw new IllegalStateException("Error al obtener el ticket", e);
        } finally {
            JdbcUtils.closeResultSet(rs);
            JdbcUtils.closeStatement(pstmt);
            JdbcUtils.closeConnection(connection);
        }
        return ticket;
    }

    public List<Ticket> getTicketsPorPropietario(Integer codigoEmpleadoPropietario) {
        List<Ticket> tickets = new ArrayList<Ticket>();
        Connection connection = null;

        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            connection = JdbcUtils.getConnection();
            final String query = "select * from ticket where codigoEmpleadoPropietario=?";
            pstmt = connection.prepareStatement(query);
            pstmt.setInt(1,codigoEmpleadoPropietario);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                Ticket ticket = new Ticket();
                ticket.setNumero(rs.getInt("numero"));
                ticket.setFechaCreacion(rs.getDate("fechaCreacion"));
                ticket.setFechaModificacion(rs.getDate("fechaModificacion"));
                ticket.setFechaCierre(rs.getDate("fechaCierre"));
                ticket.setPrioridad(rs.getInt("prioridad"));
                ticket.setDescripcion(rs.getString("descripcion"));
                ticket.setDetalle(rs.getString("detalle"));
                ticket.setTipo(rs.getString("tipo"));
                ticket.setArchivo(rs.getString("archivo"));
                ticket.setEstado(rs.getString("estado"));
                tickets.add(ticket);
            }
        } catch (SQLException e) {
            throw new IllegalStateException("Error al obtener los tickets", e);
        } finally {
            JdbcUtils.closeResultSet(rs);
            JdbcUtils.closeStatement(pstmt);
            JdbcUtils.closeConnection(connection);
        }
        return tickets;
    }

    public List<Ticket> getTicketsPorAsignado(Integer codigoEmpleadoAsignado) {
        List<Ticket> tickets = new ArrayList<Ticket>();
        Connection connection = null;

        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            connection = JdbcUtils.getConnection();
            final String query = "select * from ticket where codigoEmpleadoAsignado=?";
            pstmt = connection.prepareStatement(query);
            pstmt.setInt(1,codigoEmpleadoAsignado);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                Ticket ticket = new Ticket();
                ticket.setNumero(rs.getInt("numero"));
                ticket.setFechaCreacion(rs.getDate("fechaCreacion"));
                ticket.setFechaModificacion(rs.getDate("fechaModificacion"));
                ticket.setFechaCierre(rs.getDate("fechaCierre"));
                ticket.setPrioridad(rs.getInt("prioridad"));
                ticket.setDescripcion(rs.getString("descripcion"));
                ticket.setDetalle(rs.getString("detalle"));
                ticket.setTipo(rs.getString("tipo"));
                ticket.setArchivo(rs.getString("archivo"));
                ticket.setEstado(rs.getString("estado"));
                tickets.add(ticket);
            }
        } catch (SQLException e) {
            throw new IllegalStateException("Error al obtener los tickets", e);
        } finally {
            JdbcUtils.closeResultSet(rs);
            JdbcUtils.closeStatement(pstmt);
            JdbcUtils.closeConnection(connection);
        }
        return tickets;
    }

    public Ticket insertTicket(Ticket ticket) {
        Connection connection = null;

        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            connection = JdbcUtils.getConnection();
            String query = "insert into ticket (fechaCreacion, fechaModificacion, fechaCierre, prioridad, descripcion, detalle, " +
                           "tipo, archivo, estado, codigoEmpleadoPropietario, codigoEmpleadoAsignado, codigoCategoria) values " +
                           "(?,?,?,?,?,?,?,?,?,?,?,?)";

            pstmt = connection.prepareStatement(query);
            pstmt.setDate(1,new java.sql.Date(ticket.getFechaCreacion().getTime()));
            pstmt.setDate(2,new java.sql.Date(ticket.getFechaModificacion().getTime()));
            if(ticket.getFechaCierre()==null)
                pstmt.setNull(3, Types.DATE);
            else
                pstmt.setDate(2,new java.sql.Date(ticket.getFechaCierre().getTime()));
            pstmt.setInt(4, ticket.getPrioridad());
            pstmt.setString(5, ticket.getDescripcion());
            pstmt.setString(6, ticket.getDetalle());
            pstmt.setString(7, ticket.getTipo());
            pstmt.setString(8, ticket.getArchivo());
            pstmt.setString(9, ticket.getEstado());
            pstmt.setInt(10, ticket.getUsuarioPropietario().getCodigo());
            if(ticket.getUsuarioAsignado()==null)
                pstmt.setNull(11, Types.INTEGER);
            else
                pstmt.setInt(11, ticket.getUsuarioAsignado().getCodigo());
            pstmt.setInt(12, ticket.getCategoria().getCodigo());
            
            pstmt.executeUpdate();

        } catch (SQLException e) {
            throw new IllegalStateException("Error al obtener insertar el ticket", e);
        } finally {
            JdbcUtils.closeResultSet(rs);
            JdbcUtils.closeStatement(pstmt);
            JdbcUtils.closeConnection(connection);
        }
        return ticket;
    }
}
